/*
    生产者消费者模型
    模拟仓库
*/

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
#include <unistd.h>

// 容量
#define MAX 5

// 多线程的共享资源
// 空的消费者不能消费，满的生产者不能生产
int size = 0;   //货物数量

pthread_mutex_t mut;
//定义两个条件变量，一个为不满，一个为不空
pthread_cond_t is_nfull, is_nempty;

void* producer(void* p);
void* customer(void* p);

int main()
{
    pthread_mutex_init(&mut, NULL);
    pthread_cond_init(&is_nfull, NULL);
    pthread_cond_init(&is_nempty, NULL);

    pthread_t producer_t, customer_t;

    pthread_create(&producer_t, NULL, producer, NULL);
    pthread_create(&customer_t, NULL, customer, NULL);

    pthread_join(producer_t, NULL);
    pthread_join(customer_t, NULL);
    return 0;
}

void* producer(void* p)
{
    for(int i = 0; i < 10; i++)
    {
        pthread_mutex_lock(&mut);
        while(size == MAX)
        {
            printf("仓库已满，等待取货!\n");
            pthread_cond_wait(&is_nfull, &mut);
        }
        //仓库已经不为满
        size++;
        printf("生产中 >>> ,生产完成！，仓库中货物%d件\n", size);
        //唤醒仓库不为空
        pthread_cond_signal(&is_nempty);
        pthread_mutex_unlock(&mut);
        // sleep(1);
        sched_yield();
    }
}

void* customer(void* p)
{
    for(int i = 0; i < 10; i++)
    {
        pthread_mutex_lock(&mut);
        while(size == 0)
        {
            printf("仓库中没有货物，等待生产中！\n");
            pthread_cond_wait(&is_nempty, &mut);
        }
        //仓库中的货物不为空
        size--;
        printf("从仓库中拿走货物，仓库货物剩余 %d\n", size);
        pthread_cond_signal(&is_nfull);
        pthread_mutex_unlock(&mut);
        // sleep(2);
        sched_yield();
    }
}